/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modules.enderecamento.bo;

import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import modules.enderecamento.exception.EspacoExcedidoPaleteException;
import modules.enderecamento.exception.EspacoExcedidoRuaException;
import modules.enderecamento.exception.ReincidenciaException;
import modules.enderecamento.exception.SaldoInsuficienteException;
import modules.enderecamento.models.dao.EnderecamentoDAO;
import modules.enderecamento.models.dto.Enderecamento;
import modules.enderecamento.models.dto.Entrada;
import modules.enderecamento.models.dto.Palete;
import modules.enderecamento.models.dto.Produto;
import modules.enderecamento.models.dto.Rua;
import modules.enderecamento.models.dto.Saida;
import modules.enderecamento.util.BoxPanel;
import modules.enderecamento.util.Funcoes;

/**
 *
 * @author Clezio
 */
public class EnderecamentoBO {
    public boolean registrarEntrada(Entrada entrada,Boolean ignoreEspaco) throws EspacoExcedidoPaleteException, EspacoExcedidoRuaException{
        try{
            new EnderecamentoDAO().registrarEntrada(entrada,ignoreEspaco);
            return true;
        }catch(EspacoExcedidoPaleteException e){
            throw e;
        }catch(EspacoExcedidoRuaException e){
            throw e;
        }catch(Exception e){
            BoxPanel.showMessageDialog(null,"Não foi possível registrar entrada. Por favor, tente novamente.");
            Funcoes.registrarLog(e);
        }
        return false;
    }

    public List<Enderecamento> getList(String sql){
        try{
            return new EnderecamentoDAO().getList(sql);
        }catch(Exception e){
            BoxPanel.showMessageDialog(null,"Não foi possível listar Endereçamentos.");
            Funcoes.registrarLog(e);
        }
        return null;
    }

    public Enderecamento retrieve(Integer pk){
        try{
            return new EnderecamentoDAO().retrieve(pk);
        }catch(Exception e){
            BoxPanel.showMessageDialog(null,"Endereçamento não encontrado");
            Funcoes.registrarLog(e);
        }
        return null;
    }

    public List<Enderecamento> getListByPalete(Palete palete) {
        try {
            return new EnderecamentoDAO().getListByPalete(palete);
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível listar Endereçamento.");
            Funcoes.registrarLog(ex);
        }
        return null;
    }

    public boolean registrarSaida(Saida saida) throws SaldoInsuficienteException {
        try{
            new EnderecamentoDAO().registrarSaida(saida);
            return true;
        }catch(SaldoInsuficienteException e){
            throw e;
        }catch(Exception e){
            BoxPanel.showMessageDialog(null,"Não foi possível registrar saída.");
            Funcoes.registrarLog(e);
        }
        return false;
    }

    public boolean checkProdutoPalete(Produto produto, Palete palete) {
        try {
            return new EnderecamentoDAO().checkProdutoPalete(produto, palete);
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível checar Endereçamento.");
            Funcoes.registrarLog(ex);
        }
        return false;
    }

    public boolean removeProdutosPalete(Integer paleteId) {
        try {
            new EnderecamentoDAO().removeProdutosPalete(paleteId);
            return true;
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível remover produtos do Palete.");
            Funcoes.registrarLog(ex);
        }
        return false;
    }

    public boolean removeProdutosRua(String ruaName) {
        try {
            new EnderecamentoDAO().removeProdutosRua(ruaName);
            return true;
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível remover produtos dessa Rua.");
            Funcoes.registrarLog(ex);
        }
        return false;
    }

    public boolean moverProdutoPalete(Palete paleteOrigem, Palete paleteDestino, Produto produto, Integer quantidade) throws SaldoInsuficienteException, EspacoExcedidoPaleteException, EspacoExcedidoRuaException {
        try {
            new EnderecamentoDAO().moverProdutoPalete(paleteOrigem, paleteDestino, produto, quantidade);
            return true;
        }catch(SaldoInsuficienteException e){
            throw e;
        }catch(EspacoExcedidoPaleteException e){
            throw e;
        }catch(EspacoExcedidoRuaException e){
            throw e;
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível efetuar a operação.");
            Funcoes.registrarLog(ex);
        }
        return false;
    }

    public boolean moverPaleteRua(Rua ruaOrigem, Rua ruaDestino, Palete palete) throws EspacoExcedidoRuaException {
        try {
            new EnderecamentoDAO().moverPaleteRua(ruaOrigem, ruaDestino, palete);
            return true;
        }catch(EspacoExcedidoRuaException e){
            throw e;
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível remover produtos dessa Rua.");
            Funcoes.registrarLog(ex);
        }
        return false;
    }

    public List<Entrada> listarEntradasByData(Date date) {
        try {
            return new EnderecamentoDAO().listarEntradasByData(date);
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível listar registros de entrada.");
            Funcoes.registrarLog(ex);
        }
        return null;
    }

    public Entrada obterEntradaById(Integer id){
        try {
            return new EnderecamentoDAO().obterEntradaById(id);
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível obter registro.");
            Funcoes.registrarLog(ex);
        }
        return null;
    }

    public boolean cancelarEntrada(Entrada entrada) {
        try {
            if(BoxPanel.showConfirmDialog(null, "Deseja realmente cancelar a entrada com identificador "+entrada.getId()+"?") != 0){
                return false;
            }
            new EnderecamentoDAO().cancelarEntrada(entrada);
            return true;
        } catch (SaldoInsuficienteException ex) {
            BoxPanel.showMessageDialog(null,ex.getMessage());
            Funcoes.registrarLog(ex);
        } catch (ReincidenciaException ex) {
            BoxPanel.showMessageDialog(null,ex.getMessage());
            Funcoes.registrarLog(ex);
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível cancelar registro.");
            Funcoes.registrarLog(ex);
        }
        return false;
    }

    public List<Saida> listarSaidasByData(Date date) {
        try {
            return new EnderecamentoDAO().listarSaidasByData(date);
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível listar registros de saída.");
            Funcoes.registrarLog(ex);
        }
        return null;
    }

    public Saida obterSaidaById(int id) {
        try {
            return new EnderecamentoDAO().obterSaidaById(id);
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível obter registro.");
            Funcoes.registrarLog(ex);
        }
        return null;
    }

    public boolean cancelarSaida(Saida saida) {
        try {
            if(BoxPanel.showConfirmDialog(null, "Deseja realmente cancelar a saída com identificador "+saida.getId()+"?") != 0){
                return false;
            }
            new EnderecamentoDAO().cancelarSaida(saida);
            return true;
        } catch (ReincidenciaException ex) {
            BoxPanel.showMessageDialog(null,ex.getMessage());
            Funcoes.registrarLog(ex);
        } catch (EspacoExcedidoPaleteException ex) {
            BoxPanel.showMessageDialog(null,ex.getMessage());
            Funcoes.registrarLog(ex);
        } catch (EspacoExcedidoRuaException ex) {
            BoxPanel.showMessageDialog(null,ex.getMessage());
            Funcoes.registrarLog(ex);
        } catch (Exception ex) {
            BoxPanel.showMessageDialog(null,"Não foi possível cancelar registro.");
            Funcoes.registrarLog(ex);
        }
        return false;
    }
}
